package br.com.rglariguet.pioneer.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.Query;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import br.com.rglariguet.pioneer.filtropesquisa.FiltroReparoOem;
import br.com.rglariguet.pioneer.modelos.ReparoOem;

import com.google.common.base.Strings;
@Repository
@Transactional
public class ReparoOemDAO extends DaoGenerico<ReparoOem> {
	
	
	public List<ReparoOem> listarTodos() {
		return (List<ReparoOem>)getSession().createQuery("from ReparoOem as reparoOem order by reparoOem.id asc").list();
	}
	
	
	public ReparoOem buscaPorId(long id) {
		return (ReparoOem) getSession()
				.createQuery(
						"from ReparoOem as reparoOem where reparoOem.id = :id")
				.setParameter("id", id).uniqueResult();
		
	}
	
	public List<ReparoOem> listarComFiltro(FiltroReparoOem filtro) {
		
		StringBuilder sql = new StringBuilder();
		Map<String, Object> parametros = new HashMap<String, Object>();
		
		sql.append("from ReparoOem as reparoOem ");
		sql.append("where 0 = 0 and ");
		
		if (!Strings.isNullOrEmpty(filtro.getNomeCriadorReparo())) {
			sql.append("nomeCriadorReparo like :nomeCriadorReparo and ");
			parametros.put("nomeCriadorReparo", filtro.getNomeCriadorReparo());
		}
		
		if (filtro.getEntradaDeReparoDe() != null) {
			sql.append("reparoOem.dataDeEntrada >= :entradaDeReparoDe and ");	
			parametros.put("entradaDeReparoDe", filtro.getEntradaDeReparoDe());
		}
		if (filtro.getEntradaDeReparoAte() != null) {
			sql.append("reparoOem.dataDeEntrada <= :entradaDeReparoAte and ");
			parametros.put("entradaDeReparoAte", filtro.getEntradaDeReparoAte());
		}
		if (filtro.getFinalizacaoReparoDe() != null) {
			sql.append("reparoOem.dataDeFinalizacao >= :finalizacaoReparoDe and ");
			parametros.put("finalizacaoReparoDe", filtro.getFinalizacaoReparoDe());
		}
		if (filtro.getFinalizacaoReparoAte() != null) {
			sql.append("reparoOem.dataDeFinalizacao <= :finalizacaoReparoAte and ");
			parametros.put("finalizacaoReparoAte", filtro.getFinalizacaoReparoAte());
		}
		if (filtro.getDataModificacaoDe() != null) {
			sql.append("reparoOem.dataDeModificacao >= :dataModificacaoDe and ");
			parametros.put("dataModificacaoDe", filtro.getDataModificacaoDe());
		}
		if (filtro.getDataModificacaoAte() != null) {
			sql.append("reparoOem.dataDeModificacao <= :dataModificacaoAte and ");
			parametros.put("dataModificacaoAte", filtro.getDataModificacaoAte());
		}
		if (!Strings.isNullOrEmpty(filtro.getModelo())) {
			sql.append("reparoOem.produto.dadosBasicos.modelo like :modelo and ");
			parametros.put("modelo", filtro.getModelo());
		}
		if (!Strings.isNullOrEmpty(filtro.getNumeroSerie())) {
			sql.append("reparoOem.produto.numeroDeSerie like :numeroSerie and ");
			parametros.put("numeroSerie", filtro.getNumeroSerie());
		}
		if (filtro.getStatus() != null) {
			sql.append("reparoOem.status = :status and ");
			parametros.put("status", filtro.getStatus());
		}
		if (!Strings.isNullOrEmpty(filtro.getNumeroReparo())) {
			sql.append("reparoOem.numeroInternoDoReparo like :numeroReparo and ");
			parametros.put("numeroReparo", filtro.getNumeroReparo());
		}
		if (!Strings.isNullOrEmpty(filtro.getOrdemServico())) {
			sql.append("reparoOem.numeroDaOrdemDeServico like :ordemServico and ");
			parametros.put("ordemServico", filtro.getOrdemServico());
		}
		
		sql.append("0 = 0 ");
		sql.append("order by reparoOem.id asc");
		
		
		
		Query query = getSession().createQuery(sql.toString());
		
		for (Map.Entry<String, Object> paramentro : parametros.entrySet()) {
			if (paramentro.getValue().getClass().toString().contains("String")) {
				query.setParameter(paramentro.getKey(), "%"+paramentro.getValue()+"%");
			}else{
				query.setParameter(paramentro.getKey(), paramentro.getValue());
			}
		}
		
		return (List<ReparoOem>) query.list();
	}

	
	

}
